g_object_unref (out);
g_object_unref (out_mem);
}
+
+void
+broadway_output_upload_texture (BroadwayOutput *output,
+ guint32 id,
+ GBytes *texture)
+{
+ gsize len = g_bytes_get_size (texture);
+ write_header (output, BROADWAY_OP_UPLOAD_TEXTURE);
+ append_uint32 (output, id);
+ append_uint32 (output, (guint32)len);
+ g_string_append_len (output->buf, g_bytes_get_data (texture, NULL), len);
+}
+
+void
+broadway_output_release_texture (BroadwayOutput *output,
+ guint32 id)
+{
+ write_header (output, BROADWAY_OP_RELEASE_TEXTURE);
+ append_uint32 (output, id);
+}
int id,
BroadwayBuffer *prev_buffer,
BroadwayBuffer *buffer);
+void broadway_output_upload_texture (BroadwayOutput *output,
+ guint32 id,
+ GBytes *texture);
+void broadway_output_release_texture (BroadwayOutput *output,
+ guint32 id);
void broadway_output_grab_pointer (BroadwayOutput *output,
int id,
gboolean owner_event);
BROADWAY_OP_DISCONNECTED = 'D',
BROADWAY_OP_PUT_BUFFER = 'b',
BROADWAY_OP_SET_SHOW_KEYBOARD = 'k',
+ BROADWAY_OP_UPLOAD_TEXTURE = 't',
+ BROADWAY_OP_RELEASE_TEXTURE = 'T',
} BroadwayOpType;
typedef struct {
GINT_TO_POINTER (id),
g_bytes_ref (texture));
+ if (server->output)
+ broadway_output_upload_texture (server->output, id, texture);
+
return id;
}
guint32 id)
{
g_hash_table_remove (server->textures, GINT_TO_POINTER (id));
+
+ if (server->output)
+ broadway_output_release_texture (server->output, id);
}
gboolean
static void
broadway_server_resync_windows (BroadwayServer *server)
{
+ GHashTableIter iter;
+ gpointer key, value;
GList *l;
if (server->output == NULL)
return;
- /* First create all windows */
+ /* First upload all textures */
+ g_hash_table_iter_init (&iter, server->textures);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ broadway_output_upload_texture (server->output,
+ GPOINTER_TO_INT (key),
+ (GBytes *)value);
+
+ /* Then create all windows */
for (l = server->toplevels; l != NULL; l = l->next)
{
BroadwayWindow *window = l->data;
var realWindowWithMouse = 0;
var windowWithMouse = 0;
var surfaces = {};
+var textures = {};
var stackingOrder = [];
var outstandingCommands = new Array();
var inputSocket = null;
surface.imageData = imageData;
}
+function cmdUploadTexture(id, data)
+{
+ var blob = new Blob([data],{type: "image/png"});
+ var url = window.URL.createObjectURL(blob);
+ textures[id] = url;
+}
+
+function cmdReleaseTexture(id)
+{
+ var url = textures[id];
+ window.URL.revokeObjectURL(url);
+ delete textures[id];
+}
+
function cmdGrabPointer(id, ownerEvents)
{
doGrab(id, ownerEvents, false);
cmdPutBuffer(id, w, h, data);
break;
+ case 't': // Upload texture
+ id = cmd.get_32();
+ var data = cmd.get_data();
+ cmdUploadTexture(id, data);
+ break;
+
+ case 'T': // Upload texture
+ id = cmd.get_32();
+ cmdReleaseTexture(id);
+ break;
+
case 'g': // Grab
id = cmd.get_16();
var ownerEvents = cmd.get_bool ();